package threadlocal;

public class ThreadLocalDemo{
    /*
         ThreadLocal和synchronized对比:
             相同点： 都能避免线程安全问题
             不同点：
                  1. ThreadLocal是一个泛型类 , 而synchronized是一个关键字
                  2. ThreadLocal造成了线程数据的隔离 , synchronized造成了线程数据的共享
                  3. synchronized它是以时间换取安全性的，而ThreadLocal则以空间换取安全性（推荐）
     */
    /*
    ThreadLocal 类：
         明确：  ThreadLocal的主要作用用于做线程的数据隔离，解决线程安全问题
         演示线程安全问题？
 */
    public static void main(String[] args) {
        Task task = new Task();
        Thread t1 = new Thread(task,"学生A");
        Thread t2 = new Thread(task,"学生B");
        Thread t3 = new Thread(task,"学生C");

        t1.start();
        t2.start();
        t3.start();
    }
}

class Task implements Runnable{
    //创建ThreadLocal变量
    private final MyThreadLocal threadLocal = new  MyThreadLocal();

    @Override
    public void run() {
        //获取当前线程的Student对象
        Student student = threadLocal.get();
        //设置当前线程的Student对象名字
        student.setName(Thread.currentThread().getName());

        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //输出当前线程的Student对象
        System.out.println(Thread.currentThread().getName());
    }
}